Visualização com ggplot2

1 Introdução

Os exercícios a seguir foram retirados do site https://www.yan-holtz.com/PDF/Ggplot2_basicTP.html. Esta lista contempla algumas funcionalidades básicas do ggplot2, além de fazer uso do pacote dplyr para a manipulação dos dados.

Para fazer esta lista, crie um notebook no Rstudio. Tente separar os exercícios em chunks e documentar os comentários/respostas pertinentes. Para realizar os exercícios, precisaremos carregar os pacotes ggplot2 e dplyr :

library(ggplot2)
library(dplyr)

# caso algum pacote não esteja instalado: install.packages(...)

Podemos, alternativamente, carregar a biblioteca tidyverse, que “contém” (dentre outros) os pacotes ggplot2 e dplyr:

library(tidyverse)

2 Correlação

Nesta secção, iremos abordar scatterplots e bubble plots, dois dos gráficos mais comuns para visualizar correlações entre variáveis.

2.1

Carrege o dataset gapminder, contido no pacote gapminder. Observe as primeiras 6 linhas com a função head() e descreva brevemente o que você observa. Quantas linhas este dataset tem? Utilize a função nrow():

# instale o pacote se necessário: install.packages(...)

# carregue o pacote
library(...)

# agora que você carregou o pacote, o objeto gapminder pode ser acessado. Dê uma olhada:
head(...)

# quantas linhas?
nrow(...)

2.2

Quantos anos estão disponíveis neste dataset? Quantas observações (“data-points”) existem para cada ano? Abaixo temos o código completo para responder a essas perguntas (lembre-se dos verbos do dplyr, e caso você não conheça alguma das funções, consulte help(...) ou ?...).

# Número de anos diferentes:

gapminder %>%
  select(year) %>%
  unique() %>%
  nrow()
  
# número de países disponíveis por ano?

gapminder %>%  
  group_by(year)
  summarize( n=n() )
  

2.3

Construa um scatterplot mostrando a relação entre gdpPercap e lifeExp em 1952. Utilize geom_point(). O que você observa?

# complete as lacunas

gapminder %>%  
  filter(year=="1952") %>%
  ggplot( aes(x=..., y=...)) +
    geom...

2.4

No gráfico anterior, um país se destaca. Qual? Complete o código abaixo para identificá-lo:

gapminder %>%
  filter(...)

Você deverá obter algo como:

## # A tibble: 1 x 6
##   country continent  year lifeExp    pop gdpPercap
##   <fct>   <fct>     <int>   <dbl>  <int>     <dbl>
## 1 Kuwait  Asia       1952    55.6 160000   108382.

2.5

Agora, contrua o mesmo scatterplot, mas sem exibir este país. Você percebe alguma tendência? Qual? Ela faz sentido? O que poderia melhorar na visualização?

# complete:

gapminder %>%
  filter(...) %>%
  ggplot(...

Você deve obter um gráfico como este:

2.6

Colora os pontos de acordo com seus continentes (coluna continent). No parâmetro aes(), use o argumento color (lembre-se de recorrer ao help(ggplot) ou ?ggplot)

gapminder %>%
  filter(...) %>%
  ggplot( aes(..., color=...)) +
    ...

2.7

Vamos adicionar mais uma variável à nossa visualização: fazer o tamanho dos círculos proporcional à população do país (pop). Isto é feito utilizando o argumento size de aes().

2.8 Bônus

Agora, tente o seguinte:

  • experimente o tema theme_minimal() do ggplot2
  • adicione transparência para os círculos com o argumento alpha em geom_point()
  • ordene os dados por tamanho de população para colocar os círculos menores por cima dos maiores
  • utilize a função ggplotly() do pacote plotly para tornar este gráfico interativo

Você deverá obter algo como este gráfico:

3 Distribuições

Esta parte é dedicada à visualização de distribuições. Separaremos em duas partes:

  • Visualizando uma distribuição
  • Comparando distribuições para diversos grupos ou variáveis

3.1 Uma distribuição

Utilizaremos um dataset contendo o preço de AirBnb por noite de ~1000 residências na Riviera francesa. Os dados estão armazenados no Github, e podem ser carregados da seguinte forma:

# Carregando o dataset a partir do github

data <- read.table("https://raw.githubusercontent.com/holtzy/data_to_viz/master/Example_dataset/1_OneNum.csv", header=TRUE)

3.1.1

O dataset contém quantas linhas? (use nrow()). Qual é o valor mínimo? E o máximo (utilize summary() )? Você observa algo estranho? Que tipo de gráfico você utilizaria para visualizar estes dados.

3.1.2

Construa um histograma com os dados, utilizando geom_histogram(). Você está satisfeito com o resultado? Como podemos melhorar?

data %>%
  ggplot( aes(...)) +
    geom_histogram()

3.1.3

Construa um histograma contemplando preços cima de 1500 euros. ggplot2 vai mostrar uma mensagem de erro, por quê? O que ela significa? Qual é a maior desvantagem deste histograma?

data %>%
  fil.. %>%
  gg...
  

3.1.4

Construa o histograma com diferentes valores de binwidth (a largura das barras), para preços menores que 400 euros. O que você observa? É importante “brincar” com este parâmetro?

...
    geom_histogram(binwidth = ...)

3.1.5

Utilize geom_density() para construir um gráfico de densidade. Utilize o argumento fill para escolher a cor. Utilize o help() para descobrir qual é o equivalente de binwidth para o gráfico de densidade. Observe o efeito para diferentes valores.

3.2 Várias distribuições

Para esta secção, utilizaremos outro dataset armazenado no Github. Perguntas como Que probabilidade você designaria à frase Altamente provável foram respondidas em uma escala de 0-100. Estes dados nos permitem entender como as pessoas percebem o vocabulário de probabilidades. vamos carregar este dataset da seguinte forma:

# carregando os dados

data <- read.table("https://raw.githubusercontent.com/holtzy/Teaching/master/DATA/probability.csv", header=TRUE, sep=",")

3.2.1

Como de costume, verifique as principais características destes dados com nrow(), head(), summary() ou qualquer outra função que você considere útil.

3.2.2

Que tipo de gráfico você utilizaria para compara as 8 categorias?

3.2.3

Construa um boxplot simples, utilizando o default de geom_boxplot()

data %>%
  ggplot( aes(x=..., y=..., fil=...)) +
    geom_boxplot()
    

3.2.4

O que você observa? Você consegue melhorar este gráfico? O que você mudaria? Você lembra o que cada parte do “box” representa?

3.2.5

Adicione as seguintes modificações ao gráfico anterior: * ordenar os grupos em ordem crescente da mediana da coluna value. Isto é feito utilizando o pacote forcats * inverter os eixos X e Y (coord_flip()) * elimine a legenda (theme)

library(forcats) #  desnecessário se você utilizou library(tidyverse)

data %>%
  mutate(text = fct_reorder(text, value, .fun = median)) %>%  
  ggplot( aes(...)) + 
    geom_box... + 
    theme( ... ) +
    ...
    
    

3.2.6

Qual é a desvantagem deste boxplot? Como podemos melhorá-lo?

3.2.7

Vamos agora mostrar as observações individualmente utilizando geom_jitter(). Explique o que esta função faz. Tente conseguir um bom gráfico utilizando as opções width, size, alpha e color.

data %>%
  mutate(text = fct_reorder(text, value, .fun = median)) %>%
  ggplot(aes(x=text, y=value, fill=text)) +
    geom_boxplot() +
    geom_jitter(color="grey", width=.4, size=.5, alpha=.8) +
    theme(
      legend.position = "none"
    ) +
    coord_flip()

3.2.8 Bônus

  • construa um violin plot com geom_violin()
  • descubra como adicionar um círculo vermelho representando a média de cada grupo
  • faça uma busca na internet para construir um ridgeline chart

4 Ranqueamento